#ifndef CAMERA_H
#define CAMERA_H

#include <QWidget>
#include <QImage>
#include <mutex>

extern "C" {
#include "libavcodec/avcodec.h"    // FFmpeg编解码相关
#include "libavformat/avformat.h"  // 格式处理相关
#include "libavutil/imgutils.h"    // 图像工具函数
#include "libavutil/hwcontext.h"   // 硬件加速上下文
#include "libswscale/swscale.h"    //  新增swscale头文件
#include <libavutil/hwcontext_drm.h>
}

#include "rga/im2d.h"
#include "yolov8/yolov8.h"
#include "rgaresourcemanager.h"


class camera : public QObject  {
    Q_OBJECT
public:

    camera(QString url,QObject *parent = nullptr);
    ~camera();
    void initCamera();
    void closeCamera();
    bool yuv420ToRgb(AVFrame* frame, const char** buf, int* out_width, int* out_height);

signals:
    void frameReady(const char* buf, int width, int height);
    void detectionsReady(std::vector<QRectF> detections);
    void clearFrame();
    void connFailMsg(QString failMsg);

private:
    QString url;
    bool running;                // 是否运行
    bool exitSuccess;           // 退出成功
    bool isGetFrame;            // 是否成功获取到字节流数据
    // FFmpeg相关上下文
    AVFormatContext* fmtCtx;    // 输入格式上下文
    AVCodecContext* codecCtx;    // 解码器上下文
    const AVCodec* codec;        // 解码器
    AVBufferRef* hwDeviceCtx;  // 硬件设备上下文
    int videoStreamIdx;             // 视频流索引


    // 分配数据包和帧内存
    AVPacket* pkt;      // 存储压缩数据
    AVFrame* drmFrame;   // 存储硬件解码帧（drm内存）
    rga_buffer_t* srcRgaBufferPtr;  //原数据rgaBuffer
    rga_buffer_t* dstRgaBufferPtr;  //转换后数据rgaBuffer

    // 添加成员变量
    std::unique_ptr<RgaResourceManager> rga_manager;
    std::mutex rga_mutex; // 保护RGA资源的锁

    int frameWidth;
    int frameHeight;
    char *dst_buf = nullptr;
    int dst_buf_size;

    char* draw_buf = nullptr;
    size_t draw_buf_size = 0;

    rknn::yolov8::yolov8* test_yolov8 = nullptr;
    bool is_init_yolov8;

    bool initRgaHandle();
    bool checkFrameSize();
};

#endif // CAMERA_H
